#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "ESP8266_PWM.h" 

const char* ssid = "DAP";                   //路由器名字
const char* password = "12345678";          //路由器密码
const char* mqtt_server = "120.76.44.129";  //MQTT服务器IP
const int mqttPort = 1883;                  //MQTT服务器端口

const char* ESP8266_ID = "123";      //自定义ID
const char* ESP8266_user = "123";            //用户名
const char* ESP8266_password = "123";  //密码
const char* ESP8266_pub = "car_sen";         //发送主题（对方的订阅主题）
const char* ESP8266_sub = "car_res";         //订阅主题（对方的发送主题）
WiFiClient espClient;
PubSubClient client(espClient);  //定义客户端对象


const int IN1 = D1;  //板载LED，右上角的蓝色小灯
const int IN2 = D2;  //板载LED，右上角的蓝色小灯
const int IN3 = D3;  //板载LED，右上角的蓝色小灯
const int IN4 = D4;  //板载LED，右上角的蓝色小灯

void setup() {
  Serial.begin(115200);
  Serial.println("");
  pinMode(IN1, OUTPUT);  //设置LED引脚为输出模式
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);

  digitalWrite(IN1, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮
  digitalWrite(IN2, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮
  digitalWrite(IN3, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮
  digitalWrite(IN4, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮

  analogWrite(D5, 40);
  analogWrite(D6, 40);

  gotowifi();  //先连接到指定路由器
  initMQTT();  //初始化MQTT客户端
  gotoMQTT();  //连接到指定MQTT服务器，并订阅指定主题
}


void loop() {
  //在服务器连接正常的前提下，如果按下按钮，主动给手机发送一个问候语
  // if(client.connected())
  // {
  //   if(digitalRead(btn)==0)
  //   {
  //     client.publish(ESP8266_pub, "hello,Android");
  //     delay(200);
  //   }
  // }
  client.loop();  //持续运行MQTT运行函数，完成接收数据和定时发送心跳包
}

void gotowifi()  //连接WiFi
{
  WiFi.begin(ssid, password);
  Serial.print("连接WiFi中");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi连接成功");
}

void initMQTT()  //初始化MQTT设置
{
  //指定客户端要连接的MQTT服务器IP和端口
  client.setServer(mqtt_server, mqttPort);
  //绑定数据回调函数
  client.setCallback(callback);
}

void gotoMQTT()  //连接MQTT服务器
{
  //用while循环执行到连接MQTT成功
  while (!client.connected()) {
    Serial.println("连接MQTT服务器中");
    //连接MQTT服务器，提交ID，用户名，密码
    bool is = client.connect(ESP8266_ID);
    if (is) {
      Serial.println("连接MQTT服务器成功");
    } else {
      Serial.print("失败原因 ");
      Serial.print(client.state());
      delay(2000);
    }
  }
  client.subscribe(ESP8266_sub, 1);  //添加订阅
}

void callback(char* topic, byte* payload, unsigned int length)  //数据回调函数，监听数据接收
{
  Serial.print("消息来自订阅主题: ");
  Serial.println(topic);
  Serial.print("消息:");
  String data = "";
  for (int i = 0; i < length; i++) {
    data += (char)payload[i];
  }
  Serial.println(data);
  Serial.println();
  MQTT_Handler(data);  //把接收的数据，传入处理函数执行分析处理
}

void MQTT_Handler(String data)  //数据处理函数，执行对接收数据的分析处理
{
  if (data == "") {
    return;
  }
  if (data == "W") {
    digitalWrite(IN1, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN2, 1);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN3, 1);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN4, 0);
  } else if (data == "B") {
    digitalWrite(IN1, 1);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN2, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN3, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN4, 1);
  } else if (data == "L") {
    digitalWrite(IN1, 1);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN2, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN3, 1);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN4, 0);
  } else if (data == "R") {
    digitalWrite(IN1, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN2, 1);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN3, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN4, 1);
  } else if (data == "S") {
    digitalWrite(IN1, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN2, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN3, 0);  //初始LED为高电平（熄灭），板载LED为低电平点亮
    digitalWrite(IN4, 0);
  }
}
